#ifndef MARTIALE_H
#define MARTIALE_H 1

#include "ADDItemObjet.h"

#include <string>
#include <iostream>
#include <vector>

/**
 * Structure permettant de gérer les groupes larges de compétences
 * martiales. Les groupes restreints sans groupe larges sont également
 * représenté par cette structure.
 */
struct GLarge
{
  std::string Nom;          /**< Nom du groupe large */
  unsigned Restreints;  /**< Nombre de groupes restreints, si 0, alors
			 * c'est un groupe restreint */
  std::vector< std::string > NomsRestreints; /**< Noms des groupes restreints
					       si applicable */
};

/**
 * Structure permettant la gestion des compétences martiales, contient
 * toutes les informations nécessaire à l'affichage de celles-ci.
 *
 * Arme de prédilection donne un bonus de \f$+1\f$ au toucher,
 * expertise martiale donne le même nombre d'attaque que
 * spécialisation.
 *
 * Pour une arme de mélée, la spécialisation permet de gagner \f$+1\f$
 * au toucher et \f$+2\f$ aux dégâts ainsi qu'une demi-attaque par
 * round. Pour les armes à projectiles, le bonus est de \f$+1\f$ au
 * toucher (toute portée) ainsi que d'éventuelles attaques
 * supplémentaire. Pour les arcs ou arbalètes, le spécialiste gagne
 * une nouvlle portée (bout portant), qui donne un bonus de \f$+2\f$
 * dégâts, la limite de portée d'une telle attaque est de 10 mètres
 * pour un arc et de 20 mètre pour une arbalètes (18?).
 *
 * La maîtrise donne un bonus de \f$+3\f$ au toucher et aux dégâts
 * pour les armes de mélées et les arcs / arbalètes utilisés à bout
 * portant. Pour les armes à projectiles, le bonus au toucher est de
 * \f$+2\f$.
 *
 * La \e haute maîtrise permet au personnage d'abaisser le facteur de
 * vitesse de son arme d'une catégorie. Les armes à projectiles
 * gangent une nouvelle portée : la portée extrème, égale à
 * \f$\tfrac{4}{3}\f$ de la portée longue. La pénalité au toucher est
 * de \f$-10\f$ avant l'application des bonus.
 *
 * La grande maîtrise permet au personnage d'attaquer une fois de plus
 * par round (en plus de la spécialisation). Le dé de dégât est
 * augmenté, ce qui signifie qu'un grand maître à l'épée longue
 * inflige 1d10/1d20 dégâts.
 *
 * @author Johan "Solo" Luisier
 */
class Martiale : public ADDItemObjet
{
 public:
  Martiale(const std::string& nom, const std::string masse,
	   const char& taille, const std::string& type,
	   const unsigned& vitesse, const std::string& freq,
	   const std::string& portee, const std::string& pm,
	   const std::string& grand, const bool& aff,
	   const unsigned& large, const unsigned& restreint/*,
	   const unsigned& niveau = 0*/);
  Martiale( const Martiale & mart );
  ~Martiale();
  Martiale& operator=( const Martiale & mart );
  bool operator==( const Martiale & mart ) const;
  /**
   * Surcharge de l'opérateur <<, permet d'obtenir un affichage
   * simple. Est utilisé uniquement pour l'affichage des compétences
   * dans la feuille de perso, c'est pourquoi on a une syntaxe LaTeX
   * pour un tableau.
   *
   * @param os flot de sortie.
   * @param mart compétence martiale que l'on veut afficher.
   *
   * @return le flot une fois modifié. 
   */
  friend std::ostream& operator<<(std::ostream& os, const Martiale& mart);
  std::ostream& afficheTout(std::ostream& os) const;
  FlotMessage& afficheTout(FlotMessage& flot) const;
  const std::string& poids() const;
  const char& tailleArme() const;
  const std::string& typeDegats() const;
  const unsigned& vitesse() const;
  const std::string& frequence() const;
  const std::string& portee() const;
  const std::string& degatsPM() const;
  const std::string& degatsG() const;
  const bool& afficherSuite() const;
  const unsigned& groupeLarge() const;
  const unsigned& groupeRestreint() const;
  /* const unsigned& niveauSpec() const; */
  /* const bool& armePredilection() const; */
  /* const bool& expertiseMartiale() const; */
 private:
  //std::string Nom_arme;      /** Nom de l'arme */
  std::string Poids;         /**< Poids de l'arme (En LaTeX) */
  char TailleArme;          /**< Taille */
  std::string TypeDegats;   /**< Type de dégâts */
  unsigned Vitesse;          /**< Facteur de vitesse */
  std::string Frequence,     /**< Fréquence du tir */
    Portee;                  /**< Portée du tir */
  std::string DegatsPM,     /**< Dégats sur cible P ou M (En
			       LaTeX) */
    DegatsG;                /**< Dégats sur cible G ou plus (En
			       LaTeX) */
  bool AfficherSuite;       /**< Afficher la suivante */
  unsigned GroupeLarge;     /**< Groupe large */
  unsigned GroupeRestreint; /**< Groupe restreint */
  /* unsigned NiveauSpec;      /\**< Niveau de spécialisation */
  /* 			       (spécialiste, maîtrise, grande */
  /* 				maîtrise, ... *\/ */
  /* bool ArmePredilection;    /\**< \e true si l'arme en question est */
  /* 			       l'arme de prédilection du */
  /* 				personnage. *\/ */
  /* bool ExpertiseMartiale;   /\**< \e true si le personnage est un */
  /* 			       expert en maniement de l'arme en */
  /* 			       question (expertise martiale). */
  /* 			    *\/ */
};

/**
 * Compétence martiale "vide", utilisée comme valeur de retour lorsque
 * l'on tente d'accéder à une valeur inexistante.
 */
static Martiale MartialeInconnue( "", "", 0, "", 0, "", "", "", "",
				  false, -1u, 0 );

#endif // MARTIALE_H
